namespace study6_06 {

    // Omit 与工具类型如 Partial、Pick 等结合使用



    // 1、创建可选的用户更新类型
    interface User {
        id: number;
        name: string;
        email: string;
        password: string;
    }

    // 创建一个类型，排除 id 属性，并将其他属性设为可选
    type UserUpdate = Partial<Omit<User, 'id'>>

    // / 创建一个符合 UserUpdate 类型的对象
    let updateUser: UserUpdate = {
        name: '林萃',
        email: '123@qq.com'
    }

    console.log(updateUser); // { name: '林萃', email: '123@qq.com' }

    // 解析： Partial < Omit < User, 'id' >> 首先排除了 id 属性，然后将剩余的属性设为可选。



    // 2、创建一个用于表单输入的类型

    // 定义 User 类型
    interface User2 {
        id: number;
        name: string;
        email: string;
        password: string;
    }

    // 创建一个类型，排除 id 和 password 属性，并将其他属性设为可选

    type UserFormData = Partial<Omit<User2, 'id' | 'password'>>

    // 创建一个符合 UserFormData 类型的对象

    let formDate: UserFormData = {
        name: '志超',
        email: '123@qq.cn'
    }

    console.log(formDate); // { name: '志超', email: '123@qq.cn' }

    // 解析： Partial < Omit < User, 'id' | 'password' >> 创建了一个类型 UserFormData，
    // 排除了 id 和 password 属性，并将其他属性设为可选，适用于表单数据的处理。


    // 3、创建包含部分必填字段的接口

    // 定义 User 类型
    interface User3 {
        id: number;
        name: string;
        email: string;
        password: string;
    }

    // 创建一个类型，排除 password 属性，并只选择 id 和 name 作为必填字段
    type UserSummary = Pick<Omit<User3, 'password'>, 'id' | 'name'>

    // 创建一个符合 UserSummary 类型的对象
    let userSummary: UserSummary = {
        id: 3,
        name: '崔梦娇'
    }

    console.log(userSummary); // { id: 3, name: '崔梦娇' }



    // 4、结合用户的公共和私有数据

    // 定义 User 类型
    interface User4 {
        id: number;
        name: string;
        email: string;
        password: string;
    }

    // 创建一个类型，包含用户的公共信息（不包括 password）
    type PublicUser = Omit<User4, 'password'>

    // 创建一个类型，包含用户的私有信息（仅包括 password）
    type PrivateUser = Pick<User4, 'password'>

    // 创建符合 PublicUser 和 PrivateUser 类型的对象
    let publickUser: PublicUser = {
        id: 4,
        name: '长生',
        email: '234@qq.com'
    }

    let privateUser: PrivateUser = {
        password: '12436546'
    }

    console.log(publickUser); // { id: 4, name: '长生', email: '234@qq.com' }
    console.log(privateUser); // { password: '12436546' }

    // 解析： Omit < User, 'password' > 排除了 password 属性以获得 PublicUser 类型，
    // 而 Pick < User, 'password' > 选择了 password 属性以获得 PrivateUser 类型。
    // 这样可以有效地区分用户信息的公开和私有部分。

    // 5、创建表单验证类型
    // 定义 User 类型
    interface User5 {
        id: number;
        name: string;
        email: string;
        password: string;
    }

    // 创建一个类型，排除 id 和 password 属性，用于表单验证
    type UserFormValidation = Omit<User5, 'id' | 'password'>

    // 创建一个符合 UserFormValidation 类型的对象
    let formValidation: UserFormValidation = {
        name: 'lwj',
        email: '799@qq.cn'
    }
    console.log(formValidation); // { name: 'lwj', email: '799@qq.cn' }



    // 6、合并多个类型

    // 定义 User 和 Address 类型
    interface User6 {
        id: number;
        name: string;
        email: string;
        password: string;
    }

    interface Address {
        street: string;
        city: string;
        zipCode: string;
    }

    // 创建一个合并 User 和 Address 类型的类型，排除掉 password 属性
    type UserWithAddress = Omit<User6, 'password'> & Address

    // 创建一个符合 UserWithAddress 类型的对象
    let userWithAddress: UserWithAddress = {
        id: 6,
        name: '戴哥',
        city: '河北石家庄',
        email: '345@qq.com',
        street: '23 elm st',
        zipCode: '12345'
    }

    console.log(userWithAddress);


}